package com.cc.police.config;

import com.alibaba.fastjson.JSON;

import com.cc.police.config.LoginRequired;
import com.cc.police.util.HttpclientUtil;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.invoke.MethodHandle;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class AuthInterceptor extends HandlerInterceptorAdapter {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {


//            registry.addResourceHandler("/upload/**").addResourceLocations("file:C:/work/temp/temp0/temp1/upload/");
//如果请求为静态资源请求时，类型转换会报错，类型不对应，所以应再请求时方法请求时再转换类型
// 如果不是映射到方法直接通过
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        // 拦截代码
        // 判断被拦截的请求的访问的方法的注解(是否时需要拦截的)

        HandlerMethod hm = (HandlerMethod) handler;
        LoginRequired methodAnnotation = hm.getMethodAnnotation(LoginRequired.class);

        StringBuffer url = request.getRequestURL();
        System.out.println("url="+url);

        // 是否拦截
        if (methodAnnotation == null) {
            return true;//没有注解的都放行
        }

        String token = request.getHeader("token");
        System.out.println("拦截器前台传的token=  "+token);


        // 是否必须登录
        boolean loginSuccess = methodAnnotation.loginSuccess();// 获得该请求是否必登录成功
        System.out.println("该请求是否必须登录成功"+loginSuccess);

        // 调用认证中心进行验证
        String success = "fail";
        Map<String,String> successMap = new HashMap<>();

        if(StringUtils.isNotBlank(token)){//判断token是否为空  是的话不走该方法
//            String ip = request.getHeader("x-forwarded-for");// 通过nginx转发的客户端ip
//            if(StringUtils.isBlank(ip)){
//                ip = request.getRemoteAddr();// 从request中获取ip
//                if(StringUtils.isBlank(ip)){
//                    ip = "127.0.0.1";
//                }
//            }
            String ip ="127.0.0.1";
            String successJson  = HttpclientUtil.doGet("http://127.0.0.1:8080/verify?token=" + token+"&currentIp="+ip);

            successMap = JSON.parseObject(successJson,Map.class);

            success = successMap.get("status");
            System.out.println("success= "+success);

        }

        if (loginSuccess) {
            // 必须登录成功才能使用
            if (!success.equals("success")) {
                System.out.println("IF判断里success= "+success);
                //重定向会passport登录
                StringBuffer requestURL = request.getRequestURL();
                response.sendRedirect("http://127.0.0.1:8080/tologion");
                return false;
            }

//            // 需要将token携带的用户信息写入
//            request.setAttribute("memberId", successMap.get("memberId"));
//            request.setAttribute("nickname", successMap.get("nickname"));


        }
//        else {
            // 没有登录也能用，但是必须验证
//            if (success.equals("success")) {
//                // 需要将token携带的用户信息写入
//                request.setAttribute("memberId", successMap.get("memberId"));
//                request.setAttribute("nickname", successMap.get("nickname"));
//
//
//
//            }
//        }


        return true;
    }
}
